﻿package mortal.game.scene3D.map3D.AstarAnyDirection.processor
{
    import __AS3__.vec.*;
    import mortal.game.scene3D.map3D.AstarAnyDirection.*;
    import mortal.game.scene3D.map3D.AstarAnyDirection.data.*;
    import mortal.game.scene3D.map3D.util.*;

    public class MapGridToPixels extends Object
    {
        private static const SERVERDISTANCE:Number = 60;
        private static const SERVERMAXDISTANCE:Number = 80;

        public function MapGridToPixels()
        {
            return;
        }// end function

        public static function work(param1:Array) : Array
        {
            var _loc_2:Array = null;
            var _loc_4:AstarTurnPoint = null;
            var _loc_5:AstarTurnPoint = null;
            var _loc_6:Number = NaN;
            var _loc_7:AstarTurnPoint = null;
            var _loc_8:int = 0;
            var _loc_9:int = 0;
            var _loc_10:int = 0;
            var _loc_12:Number = NaN;
            var _loc_13:Number = NaN;
            var _loc_14:Number = NaN;
            var _loc_15:int = 0;
            var _loc_16:int = 0;
            _loc_2 = [];
            var _loc_3:* = param1.length;
            var _loc_11:int = 0;
            while (_loc_11 < _loc_3)
            {
                
                _loc_4 = param1[_loc_11];
                _loc_4._x = (_loc_4._x + 0.5) * GameMapUtil.tileWidth;
                _loc_4._y = (_loc_4._y + 0.5) * GameMapUtil.tileHeight;
                _loc_11++;
            }
            _loc_11 = 0;
            while (_loc_11 < _loc_3)
            {
                
                _loc_4 = param1[_loc_11];
                if (_loc_11 != (_loc_3 - 1))
                {
                    _loc_5 = param1[(_loc_11 + 1)];
                }
                else
                {
                    _loc_7 = new AstarTurnPoint();
                    _loc_7._x = _loc_4._x;
                    _loc_7._y = _loc_4._y;
                    _loc_7.distance = _loc_4.distance;
                    _loc_2.push(_loc_7);
                }
                _loc_6 = GeomUtil.calcDistance(_loc_4._x, _loc_4._y, _loc_5._x, _loc_5._y);
                _loc_7 = new AstarTurnPoint();
                _loc_7._x = _loc_4._x;
                _loc_7._y = _loc_4._y;
                _loc_7.distance = _loc_4.distance;
                _loc_2.push(_loc_7);
                if (_loc_6 < SERVERMAXDISTANCE)
                {
                }
                else
                {
                    _loc_12 = _loc_5._y - _loc_4._y;
                    _loc_13 = _loc_5._x - _loc_4._x;
                    _loc_15 = int((_loc_6 - SERVERMAXDISTANCE) / SERVERDISTANCE) + 1;
                    _loc_16 = 1;
                    while (_loc_16 <= _loc_15)
                    {
                        
                        _loc_14 = _loc_16 * SERVERDISTANCE / _loc_6;
                        _loc_7 = new AstarTurnPoint();
                        _loc_7._x = _loc_14 * _loc_13 + _loc_4._x;
                        _loc_7._y = _loc_14 * _loc_12 + _loc_4._y;
                        _loc_7.distance = _loc_4.distance + _loc_6 * _loc_14;
                        _loc_2.push(_loc_7);
                        _loc_16++;
                    }
                }
                _loc_11++;
            }
            if (_loc_2 != null && _loc_2.length >= 2)
            {
                if (!lineWalkable(_loc_2[0] as AstarTurnPoint, _loc_2[1] as AstarTurnPoint))
                {
                    fixFirstPoint(_loc_2);
                }
                else
                {
                    _loc_2.shift();
                }
            }
            return _loc_2;
        }// end function

        public static function lineWalkable(param1:AstarTurnPoint, param2:AstarTurnPoint) : Boolean
        {
            var _loc_5:int = 0;
            var _loc_6:int = 0;
            var _loc_7:int = 0;
            var _loc_3:* = GeomUtil.calcLinePassGridesFastMidle(param1._x, param1._y, param2._x, param2._y);
            var _loc_4:int = 0;
            while (_loc_4 < _loc_3.length)
            {
                
                _loc_5 = int(_loc_3[_loc_4]) / GameMapUtil.tileWidth;
                _loc_6 = int(_loc_3[(_loc_4 + 1)]) / GameMapUtil.tileHeight;
                _loc_7 = AstarAnyDirection.mapData[_loc_5][_loc_6];
                if (!MapGridCutter.walkable(_loc_7))
                {
                    return false;
                }
                _loc_4 = _loc_4 + 2;
            }
            return true;
        }// end function

        private static function fixFirstPoint(param1:Array) : void
        {
            var _loc_6:Number = NaN;
            var _loc_2:* = param1[0];
            var _loc_3:* = param1[1];
            var _loc_4:* = _loc_3._y - _loc_2._y;
            var _loc_5:* = _loc_3._x - _loc_2._x;
            if (_loc_5 == 0)
            {
                if (_loc_4 != 0)
                {
                    _loc_2._y = int(_loc_2._y / GameMapUtil.tileHeight) * GameMapUtil.tileHeight + _loc_4 / Math.abs(_loc_4) * (GameMapUtil.tileHeight - 2);
                }
            }
            else
            {
                _loc_6 = Math.abs(_loc_4 / _loc_5);
                if (_loc_6 > GameMapUtil.tileHeight / GameMapUtil.tileWidth)
                {
                    _loc_6 = Math.abs(0.4 * GameMapUtil.tileHeight / _loc_4);
                }
                else
                {
                    _loc_6 = Math.abs(0.4 * GameMapUtil.tileWidth / _loc_5);
                }
                _loc_2._x = _loc_2._x + _loc_5 * _loc_6;
                _loc_2._y = _loc_2._y + _loc_4 * _loc_6;
            }
            return;
        }// end function

    }
}
